/****
 * 完美的封装，对于外界用户来说，struct stack 这个结构体的内部细节，以及各个函数的具体实现方式都是不可见的
 * ******/
#include "stack.h"
#include <stdlib.h>

struct stack{
    int     top;
    int     *p_buf;
    unsigned int size;
}; /*类的实际定义*/

struct stack * stack_create(int size)
{
    struct stack *p_stack = (struct stack*)malloc(sizeof(struct stack)); /*创建一个栈对象*/
    if(p_stack != NULL) {
        p_stack->top = 0;
        p_stack->size = size;
        p_stack->p_buf=(int*)malloc(sizeof(int)*size);
        if(p_stack->p_buf != NULL) {
            return p_stack;
        }
        free(p_stack); /*分配栈内存失败*/
    }

    return NULL; /*创建栈失败，返回NULL*/
}

//////////////是否要对stack_push 和 stack_pop 进行指针为空的判断
int stack_push(struct stack *p_stack, int val)
{
    if(p_stack->top != p_stack->size) { /*如果不是栈顶*/
        p_stack->p_buf[p_stack->top++] = val;
        return 0;
    }

    return -1;
}

int stack_pop(struct stack *p_stack, int *p_val)
{
    if(p_stack->top != 0) { /*如果不是栈尾*/
        *p_val = p_stack->p_buf[--p_stack->top];
        return 0;
    }

    return -1;
}

int stack_delete(struct stack *p_stack)
{
    if(p_stack == NULL) {
        return -1;
    }

    if(p_stack->p_buf != NULL) {
        free(p_stack->p_buf);
    }

    free(p_stack);
    return 0;
}

